package com.lagou.StageOne.Module4.Assignment.Assignment3;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Server {

    public static void main(String[] args) {
        // 创建服务端对象
        Server s = new Server(8888);
        // 开始服务
        s.begin();

    }

    private ServerSocket ss = null;
    private Socket s = null;
    // 定义一个集合储存连接的socket，以便转发给所有连接转发消息与文件
    private static List<Socket> socketList = new ArrayList<>();
    private String path;

    public Server(int port) {
        // 启动服务
        try {
            ss = new ServerSocket(port);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 开始服务主程序
    public void begin() {
        System.out.println("等待客户端的连接请求...");
        try {
            // 无限循环，持续服务
            while (true) {
                // 获取连接
                s = ss.accept();
                // 储存连接至集合
                socketList.add(s);
                System.out.println("客户端" + s.getInetAddress() + "连接成功！");
                // 待定：需要执行的任务
                task(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != ss) {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }



    public void task(Socket socket) {
        // 接受到的客户端连接，都新建一个线程进行服务
        new Thread(() -> {
            // 定义输入输出流流
            DataInputStream in = null;
            DataOutputStream out = null;
            try {
                in = new DataInputStream(socket.getInputStream());
                out = new DataOutputStream(socket.getOutputStream());
                // 持续通信
                while (true) {
                    // 读取客户端发来的文本
                    String str = in.readUTF();
                    System.out.println(str);
                    // 打印
                    System.out.println("客户端" + s.getInetAddress() +": "+ str);
                    // 拆分文本内容
                    String type = str.split(":")[0];// 类型
                    int messageLen = Integer.valueOf(str.split(":")[2]);// 消息长度
                    String message = str.split(":")[3];// 消息
                    // 如果消息类型为chat，则进入聊天服务处理块
                    if ("chat".equalsIgnoreCase(type)) {
                        // 转发收到的消息
                        for (Socket s : socketList) {
                            DataOutputStream outAll = new DataOutputStream(s.getOutputStream());
                            outAll.writeUTF(str);
                        }
                        // 如果收到的消息是bye，则退出while循环，即结束连接
                        if ("bye".equalsIgnoreCase(message)) {
                            System.out.println("客户端" + s.getInetAddress() + "已下线！");
                            break;
                        }
                    }
                }
                // 连接结束时，从集合中移除该socket对象
                socketList.remove(socket);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (null != in) {

                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (null != out) {

                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();


    }

}
